Electronics systems which may include both hardware and software components, must be tested or functionally verified in order to ensure, as far as practicable, that they operate correctly under all conceivable circumstances.
Differences between the intended or required functionality of the system and the actual functionality are commonly referred to as “bugs” and may fall into three general categories:    (1) Syntax coding errors, i.e. where the coding employed to implement the algorithms has been used incorrectly. These problems should rarely propagate to the final product.    (2) Syntax or semantic misuse, for example where the coding has been used in a legal way (i.e. it is syntactically correct) but one or more possible implications of the way in which the syntax has been used has not been fully considered. This may cause a malfunction either immediately or after a period of time.    (3) Incorrect functional implementation or misunderstanding. This covers cases where the required functionality has not been implemented fully or correctly. This may be due to complexity, misunderstandings, simple mistakes or other causes. Often these sorts of bugs are not at all obvious and only cause problems under unusual or unforeseen combinations of circumstances.
As such electronic systems become increasingly complex, the time and effort that needs to be expended in order to functionally test the equipment increases significantly, and can take a substantial part of the development effort and often the majority of the development effort. A significant problem is to cover every possible condition or scenario that the design may encounter during operation. For example, if the operation of the software can be illustrated in the form of a state transition diagram or state diagram where the system transitions from one state to another, the number of states in the entire state space that defines all possible states in which the system may find itself may be so large that only a small number of states may be covered by manually testing the program, and large areas of the state space must necessarily remain uncovered in any manual testing regime with the result that errors and bugs may remain undetected.